package com.leo.java8.stream;

import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;

public class NewFeaturesTester7 {
	public static void main(String args[]) {

		// forEach：该方法用于对Stream中的每个元素进行迭代操作。下面的代码段演示了如何使用forEach方法输出10个随机数。
		Random random = new Random();
		random.ints().limit(10).forEach(System.out::println);

		// map：该方法用于将每个元素映射到对应的结果上。下面的代码段演示了怎样用map方法输出唯一的某个数的平方。
		List<Integer> numbers = Arrays.asList(2, 3, 3, 2, 5, 2, 7);
		// get list of unique squares
		List<Integer> squaresList = numbers.stream().map(i -> i * i).distinct().collect(Collectors.toList());

		// filter：该方法用于过滤满足条件的元素。下面的代码段演示了怎样输出使用了过滤方法的空字符串数量。
		List<String> strings = Arrays.asList("efg", "", "abc", "bc", "ghij", "", "lmn");
		// get count of empty string
		long count = strings.stream().filter(string -> string.isEmpty()).count();

		// limit：该方法用于减少Stream的大小。下面的代码段演示了怎样有限制地输出10个随机数。
		/*Random random = new Random();
		random.ints().limit(10).forEach(System.out::println);*/

		// sorted：该方法用于对Stream排序。下面的代码段演示了怎样以有序的形式输出10个随机数。
		/*Random random = new Random();
		random.ints().limit(10).sorted().forEach(System.out::println);*/

		// ParallelStream是Stream用于并行处理的一种替代方案。下面的代码段演示了如何使用它来输出空字符串的数量。
		/*List<String> strings = Arrays.asList("efg", "", "abc", "bc", "ghij", "", "lmn");
		// 获得空字符串的计数
		long count = strings.parallelStream().filter(string -> string.isEmpty()).count();*/

		// Collector用于合并Stream的元素处理结果。它可以用于返回一个字符串列表。下面的代码段演示了如何使用它。
		/*List<String> strings = Arrays.asList("efg", "", "abc", "bc", "ghij", "", "lmn");
		List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

		System.out.println("Filtered List: " + filtered);
		String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
		System.out.println("Merged String: " + mergedString);*/

		// 统计工具
		// Java 8引入了用于统计的Collector来计算Stream处理完成后的所有统计数据。
		// 下面的代码段演示了如何使用它。
		/*List<Integer> numbers = Arrays.asList(2, 3, 3, 2, 5, 2, 7);
		IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
		System.out.println("Highest number in List : " + stats.getMax());
		System.out.println("Lowest number in List : " + stats.getMin());
		System.out.println("Sum of all numbers : " + stats.getSum());
		System.out.println("Average of all numbers : " + stats.getAverage());*/

	}

}